// package vip.liux.contracts.security.sms;
//
// import org.apache.commons.lang3.ClassUtils;
// import org.springframework.beans.factory.NoSuchBeanDefinitionException;
// import org.springframework.context.ApplicationContext;
// import org.springframework.security.config.annotation.web.HttpSecurityBuilder;
// import org.springframework.security.config.annotation.web.configurers.AbstractAuthenticationFilterConfigurer;
// import org.springframework.security.core.userdetails.UserCache;
// import org.springframework.security.provisioning.UserDetailsManager;
// import org.springframework.security.web.authentication.ForwardAuthenticationFailureHandler;
// import org.springframework.security.web.authentication.ForwardAuthenticationSuccessHandler;
// import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
// import org.springframework.security.web.util.matcher.RequestMatcher;
// import vip.liux.contracts.security.UserDetailsManagerAdapter;
//
// import java.lang.reflect.Field;
// import java.lang.reflect.Method;
//
// public class SmsAuthenticationConfigDeprecated<H extends HttpSecurityBuilder<H>> extends
//         AbstractAuthenticationFilterConfigurer<H, SmsAuthenticationConfigDeprecated<H>, SmsAuthenticationFilter> {
//     public SmsAuthenticationConfigDeprecated() {
//         super(new SmsAuthenticationFilter(), null);
//         codeParameter("code");
//         mobileParameter("mobile");
//     }
//
//     @Override
//     public SmsAuthenticationConfigDeprecated<H> loginPage(String loginPage) {
//         return super.loginPage(loginPage);
//     }
//
//     public SmsAuthenticationConfigDeprecated<H> codeParameter(String codeParameter) {
//         getAuthenticationFilter().setCodeParameter(codeParameter);
//         return this;
//     }
//
//
//     public SmsAuthenticationConfigDeprecated<H> mobileParameter(String mobileParameter) {
//         getAuthenticationFilter().setMobileParameter(mobileParameter);
//         return this;
//     }
//
//     public SmsAuthenticationConfigDeprecated<H> failureForwardUrl(String forwardUrl) {
//         failureHandler(new ForwardAuthenticationFailureHandler(forwardUrl));
//         return this;
//     }
//
//     public SmsAuthenticationConfigDeprecated<H> successForwardUrl(String forwardUrl) {
//         successHandler(new ForwardAuthenticationSuccessHandler(forwardUrl));
//         return this;
//     }
//
//     @Override
//     public void configure(H http) throws Exception {
//         super.configure(http);
//     }
//
//     @Override
//     public void init(H http) throws Exception {
//         super.init(http);
//         initDefaultLoginFilter(http);
//
//         registerDefaultAuthenticationProvider(http);
//     }
//
//     private void registerDefaultAuthenticationProvider(H http) {
//         SmsAuthenticationProvider provider = getBeanOrNull(http, SmsAuthenticationProvider.class);
//         if (provider == null) {
//             SmsAuthenticationProvider smsAuthenticationProvider = new SmsAuthenticationProvider();
//
//             UserDetailsManager userDetailsManager = getBeanOrNull(http, UserDetailsManager.class);
//             if (userDetailsManager != null) {
//                 smsAuthenticationProvider.setUserDetailsManager(userDetailsManager);
//             } else {
//                 smsAuthenticationProvider.setUserDetailsManager(UserDetailsManagerAdapter.SUPPLIER.get());
//             }
//             UserCache userCache = getBeanOrNull(http, UserCache.class);
//             if (userCache != null) {
//                 smsAuthenticationProvider.setUserCache(userCache);
//             }
//             CaptchaCache captchaCache = getBeanOrNull(http, CaptchaCache.class);
//             if (captchaCache != null) {
//                 smsAuthenticationProvider.setCaptchaCache(captchaCache);
//             }
//             http.authenticationProvider(postProcess(smsAuthenticationProvider));
//         }
//     }
//
//     @Override
//     protected RequestMatcher createLoginProcessingUrlMatcher(String loginProcessingUrl) {
//         return new AntPathRequestMatcher(loginProcessingUrl, "POST");
//     }
//
//     private String getCodeParameter() {
//         return getAuthenticationFilter().getCodeParameter();
//     }
//
//     private String getMobileParameter() {
//         return getAuthenticationFilter().getMobileParameter();
//     }
//
//     private void initDefaultLoginFilter(H http) throws Exception {
//         // 获取 HttpSecurity 类的 filterOrders 字段
//         Field filterOrdersField = http.getClass().getDeclaredField("filterOrders");
//
//         // 设置该字段为可访问
//         filterOrdersField.setAccessible(true);
//
//         // 获取 filterOrders 字段的值
//         Object filterOrders = filterOrdersField.get(http);
//
//         Class<?> clazz = ClassUtils.getClass(" org.springframework.security.config.annotation.web.builders.FilterOrderRegistration");
//
//         // 获取 HttpSecurity 类的 addFilterAtOffsetOf 方法
//         Method putFilterMethod = clazz.getDeclaredMethod("put", Class.class, int.class);
//
//         // 设置该方法为可访问
//         putFilterMethod.setAccessible(true);
//
//         // 调用 addFilterAtOffsetOf 方法
//         putFilterMethod.invoke(filterOrders, SmsAuthenticationFilter.class, 1898);
//     }
//
//
//     private <C> C getBeanOrNull(H http, Class<C> clazz) {
//         ApplicationContext context = http.getSharedObject(ApplicationContext.class);
//         if (context == null) {
//             return null;
//         }
//         try {
//             return context.getBean(clazz);
//         } catch (NoSuchBeanDefinitionException ex) {
//             return null;
//         }
//     }
// }